package com.lizemin.builderfactorycase.entity;

import java.util.Objects;

/**
 * @author lzm
 * @date 2025/10/7 13:46
 * @description 手机类，使用构造函数创建不可变的对象
 */
public class Phone {

    /**
     * 手机品牌(必选)
     */
    private final String brand;

    /**
     * 数量（必选）
     */
    private final int quantity;

    /**
     * 是否需要质保（可选）
     */
    private boolean needInsurance;

    /**
     * 是否需要手机壳（可选）
     */
    private boolean needPhoneCase;

    /**
     * 是否需要手机膜（可选）
     */
    private boolean needScreenProtector;

    /**
     * 构造函数 因为手机的品牌和数量是必填字段，所以要求别人在使用这个类的时候必须要指定品牌和数量这两个字段
     *
     * @param quantity 数量（必选）
     * @param brand    手机品牌（必选）
     */
    public Phone(String brand, int quantity) {
        this.quantity = quantity;
        this.brand = brand;
    }

    /**
     * 构造函数 除了必填字段外，还需要允许用户设置可选字段的值
     * @param brand 手机品牌（必选）
     * @param quantity 数量（必选）
     * @param needInsurance 是否需要质保（可选）
     */
    public Phone(String brand, int quantity, boolean needInsurance) {
        this.brand = brand;
        this.quantity = quantity;
        this.needInsurance = needInsurance;
    }

    /**
     * 构造函数 除了必填字段外，还需要允许用户设置可选字段的值
     * @param brand 手机品牌（必选）
     * @param quantity 数量（必选）
     * @param needInsurance 是否需要质保（可选）
     * @param needPhoneCase 是否需要手机壳（可选）
     */
    public Phone(String brand, int quantity, boolean needInsurance, boolean needPhoneCase) {
        this.brand = brand;
        this.quantity = quantity;
        this.needInsurance = needInsurance;
        this.needPhoneCase = needPhoneCase;
    }

    /**
     * 构造函数 除了必填字段外，还需要允许用户设置可选字段的值
     * @param brand 手机品牌（必选）
     * @param quantity 数量（必选）
     * @param needInsurance 是否需要质保（可选）
     * @param needPhoneCase 是否需要手机壳（可选）
     * @param needScreenProtector 是否需要手机膜（可选）
     */
    public Phone(String brand, int quantity, boolean needInsurance, boolean needPhoneCase, boolean needScreenProtector) {
        this.brand = brand;
        this.quantity = quantity;
        this.needInsurance = needInsurance;
        this.needPhoneCase = needPhoneCase;
        this.needScreenProtector = needScreenProtector;
    }

    // 下面是get方法，注意：创建不可变的对象的类中不需要写set方法
    public String getBrand() {
        return brand;
    }

    public int getQuantity() {
        return quantity;
    }

    public boolean isNeedInsurance() {
        return needInsurance;
    }

    public boolean isNeedPhoneCase() {
        return needPhoneCase;
    }

    public boolean isNeedScreenProtector() {
        return needScreenProtector;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "brand='" + brand + '\'' +
                ", quantity=" + quantity +
                ", needInsurance=" + needInsurance +
                ", needPhoneCase=" + needPhoneCase +
                ", needScreenProtector=" + needScreenProtector +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Phone phone = (Phone) o;
        return quantity == phone.quantity && needInsurance == phone.needInsurance && needPhoneCase == phone.needPhoneCase && needScreenProtector == phone.needScreenProtector && Objects.equals(brand, phone.brand);
    }

    @Override
    public int hashCode() {
        return Objects.hash(brand, quantity, needInsurance, needPhoneCase, needScreenProtector);
    }

}
